{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-02-12T22:17:19.603440Z",
     "start_time": "2019-02-12T22:17:19.523397Z"
    }
   },
   "source": [
    "<h1><center> Facial Emotion Recognition - Hybrid Model </center></h1>\n",
    "<center> A project for the French Employment Agency </center>\n",
    "<center> Telecom ParisTech 2018-2019 </center>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# I. Context"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The aim of this notebook is to explore facial emotion recognition techniques from a live webcam video stream. \n",
    "\n",
    "The data set used for training is the Kaggle FER2013 emotion recognition data set : https://www.kaggle.com/c/challenges-in-representation-learning-facial-expression-recognition-challenge/data\n",
    "\n",
    "The models explored include :\n",
    "- Manual filters \n",
    "- Deep Learning Architectures\n",
    "- DenseNet Inspired Architectures\n",
    "\n",
    "This model will be combined with voice emotion recongition as well as psychological traits extracted from text inputs, and should provide a benchmark and a deep analysis of both verbal and non-verbal insights for candidates seeking for a job and their performance during an interview."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# II. General imports"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Versions used :"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "Python : 3.6.5\n",
    "Tensorflow : 1.10.1\n",
    "Keras : 2.2.2\n",
    "Numpy : 1.15.4\n",
    "OpenCV : 4.0.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T16:56:27.457210Z",
     "start_time": "2019-03-07T16:56:22.967106Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n",
      "Using TensorFlow backend.\n",
      "/anaconda3/lib/python3.6/site-packages/requests/__init__.py:80: RequestsDependencyWarning: urllib3 (1.21.1) or chardet (2.3.0) doesn't match a supported version!\n",
      "  RequestsDependencyWarning)\n"
     ]
    }
   ],
   "source": [
    "### General imports ###\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from time import time\n",
    "from time import sleep\n",
    "import re\n",
    "import os\n",
    "import argparse\n",
    "from collections import OrderedDict\n",
    "import matplotlib.animation as animation\n",
    "\n",
    "### Image processing ###\n",
    "from scipy.ndimage import zoom\n",
    "from scipy.spatial import distance\n",
    "import imutils\n",
    "from scipy import ndimage\n",
    "import cv2\n",
    "import dlib\n",
    "from __future__ import division\n",
    "from imutils import face_utils\n",
    "\n",
    "### CNN models ###\n",
    "import keras\n",
    "from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img\n",
    "from keras.callbacks import TensorBoard\n",
    "from keras.models import Sequential\n",
    "from keras.layers.core import Dense, Dropout, Activation, Flatten\n",
    "from keras.layers.convolutional import Conv2D, MaxPooling2D, SeparableConv2D\n",
    "from keras.utils import np_utils\n",
    "from keras.regularizers import l2#, activity_l2\n",
    "from keras.optimizers import SGD, RMSprop\n",
    "from keras.utils import to_categorical\n",
    "from keras.layers.normalization import BatchNormalization\n",
    "from keras import models\n",
    "from keras.utils.vis_utils import plot_model\n",
    "from keras.layers import Input, GlobalAveragePooling2D\n",
    "from keras.models import Model\n",
    "from tensorflow.keras import layers\n",
    "\n",
    "### Build SVM models ###\n",
    "from sklearn.preprocessing import OneHotEncoder\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn import svm\n",
    "\n",
    "### Same trained models ###\n",
    "import h5py\n",
    "from keras.models import model_from_json\n",
    "import pickle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# III. Import datas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T22:06:45.037197Z",
     "start_time": "2019-03-07T22:06:45.030746Z"
    }
   },
   "outputs": [],
   "source": [
    "path = '/Users/maelfabien/filrouge_pole_emploi/Video/'\n",
    "features_path = \"/Users/maelfabien/Desktop/LocalDB/Videos/Face_Features/\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The image :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:07:17.182354Z",
     "start_time": "2019-03-07T23:07:15.564856Z"
    }
   },
   "outputs": [],
   "source": [
    "X = np.load(local_path + \"X.npy\")\n",
    "y = np.load(local_path + \"y.npy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:07:22.865472Z",
     "start_time": "2019-03-07T23:07:22.858054Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(35887, 48, 48, 1)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:24:46.636628Z",
     "start_time": "2019-03-07T23:24:46.618123Z"
    }
   },
   "outputs": [],
   "source": [
    "shape_x = 48\n",
    "shape_y = 48\n",
    "nRows,nCols,nDims = X.shape[1:]\n",
    "input_shape = (nRows, nCols, nDims)\n",
    "classes = np.unique(y)\n",
    "nClasses = len(classes)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The HOG image :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:24:48.935866Z",
     "start_time": "2019-03-07T23:24:47.458131Z"
    }
   },
   "outputs": [],
   "source": [
    "X_hog_img = np.load(features_path + \"hog_image.npy\").reshape(-1, shape_x, shape_y, 1)/255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The HOG features :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:55:23.467666Z",
     "start_time": "2019-03-08T07:55:23.454100Z"
    }
   },
   "outputs": [],
   "source": [
    "X_hog_feat = np.load(features_path + \"hog_features.npy\").reshape(-1, 72, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Facial Landmarks :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:24:49.072305Z",
     "start_time": "2019-03-07T23:24:48.989948Z"
    }
   },
   "outputs": [],
   "source": [
    "X_land = np.load(features_path + \"landmarks.npy\").reshape(-1, 136,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "HOG Sliding Window image :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:24:51.428431Z",
     "start_time": "2019-03-07T23:24:49.664292Z"
    }
   },
   "outputs": [],
   "source": [
    "X_hog_slid_img = np.load(features_path + \"hog_slide_image.npy\").reshape(-1, shape_x, shape_y, 1)/255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "HOG Sliding Window image :"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:40:48.510496Z",
     "start_time": "2019-03-08T07:40:47.947240Z"
    }
   },
   "outputs": [],
   "source": [
    "X_hog_slid_feat = np.load(features_path + \"hog_slide_features.npy\").reshape(-1, 2592, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:55:25.579667Z",
     "start_time": "2019-03-08T07:55:25.561425Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((35887, 48, 48, 1),\n",
       " (35887, 48, 48, 1),\n",
       " (35887, 72, 1),\n",
       " (35887, 136, 1),\n",
       " (35887, 48, 48, 1),\n",
       " (35887, 2592, 1))"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape, X_hog_img.shape, X_hog_feat.shape, X_land.shape, X_hog_slid_img.shape, X_hog_slid_feat.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:24:58.388482Z",
     "start_time": "2019-03-07T23:24:53.898117Z"
    }
   },
   "outputs": [],
   "source": [
    "X_img = np.concatenate((X,X_hog_img, X_hog_slid_img), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:56:05.053393Z",
     "start_time": "2019-03-08T07:56:05.030330Z"
    }
   },
   "outputs": [],
   "source": [
    "X_i_train = X[:28000, :, :, :].reshape(-1, shape_x, shape_y, 1)\n",
    "X_hog_img_train = X_hog_img[:28000, :, :, :].reshape(-1, shape_x, shape_y, 1)\n",
    "X_hog_slid_img_train = X_hog_slid_img[:28000, :, :, :].reshape(-1, shape_x, shape_y, 1)\n",
    "X_hog_slid_feat_train = X_hog_slid_feat[:28000,:,:].reshape(-1, 2592, 1)\n",
    "X_land_train = X_land[:28000,:,:].reshape(-1, 136, 1)\n",
    "X_hog_feat_train = X_hog_feat[:28000,:,:].reshape(-1, 72, 1)\n",
    "\n",
    "X_i_test = X[28000:, :, :, :].reshape(-1, shape_x, shape_y, 1)\n",
    "X_hog_img_test = X_hog_img[28000:, :, :, :].reshape(-1, shape_x, shape_y, 1)\n",
    "X_hog_slid_img_test = X_hog_slid_img[28000:, :, :, :].reshape(-1, shape_x, shape_y, 1)\n",
    "X_hog_slid_feat_test = X_hog_slid_feat[28000:,:,:].reshape(-1, 2592, 1)\n",
    "X_land_test = X_land[28000:,:,:].reshape(-1, 136, 1)\n",
    "X_hog_feat_test = X_hog_feat[28000:,:,:].reshape(-1, 72, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:33:43.293978Z",
     "start_time": "2019-03-07T23:33:43.287452Z"
    }
   },
   "outputs": [],
   "source": [
    "X_train = X_img[:28000, :, :, :].reshape(-1, 144, shape_y, 1)\n",
    "X_test = X_img[28000:, :, :, :].reshape(-1, 144, shape_y, 1)\n",
    "y_train = y[:28000]\n",
    "y_test = y[28000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:25:19.907082Z",
     "start_time": "2019-03-07T23:25:19.577828Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(12,8))\n",
    "plt.imshow(X_train[10].reshape(144,48))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# V. Simple Deep Learning Model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Combine HOG image, Sliding window HOG image and the image itself."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:12:41.133341Z",
     "start_time": "2019-03-07T23:12:41.086905Z"
    }
   },
   "outputs": [],
   "source": [
    "def createModel():\n",
    "    model = Sequential()\n",
    "\n",
    "    model.add(Conv2D(64, (3, 3), padding='same', input_shape=(144,48,1)))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='same'))\n",
    "    model.add(Dropout(0.25))\n",
    "\n",
    "    model.add(Conv2D(128, (3, 3), padding='same'))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='same'))\n",
    "    model.add(Dropout(0.25))\n",
    "\n",
    "    model.add(Conv2D(256, (3, 3), padding='same'))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='same'))\n",
    "    model.add(Dropout(0.25))\n",
    "\n",
    "    model.add(Conv2D(512, (3, 3), padding='same'))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(MaxPooling2D(pool_size=(2, 2), strides=None, padding='same'))\n",
    "    model.add(Dropout(0.25))\n",
    "\n",
    "    model.add(Flatten())\n",
    "\n",
    "    model.add(Dense(512))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(Dropout(0.25))\n",
    "\n",
    "    model.add(Dense(256))\n",
    "    model.add(BatchNormalization())\n",
    "    model.add(Activation('relu'))\n",
    "    model.add(Dropout(0.25))\n",
    "\n",
    "    model.add(Dense(7))\n",
    "    model.add(Activation('softmax'))\n",
    "\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:13:23.873907Z",
     "start_time": "2019-03-07T23:12:58.050779Z"
    }
   },
   "outputs": [],
   "source": [
    "model = createModel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:13:26.238301Z",
     "start_time": "2019-03-07T23:13:26.234868Z"
    }
   },
   "outputs": [],
   "source": [
    "datagen = ImageDataGenerator(\n",
    "        zoom_range=0.2,          # randomly zoom into images\n",
    "        rotation_range=10,       # randomly rotate images in the range (degrees, 0 to 180)\n",
    "        width_shift_range=0.1,   # randomly shift images horizontally (fraction of total width)\n",
    "        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)\n",
    "        horizontal_flip=True,    # randomly flip images\n",
    "        vertical_flip=False)     # randomly flip images"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:21:12.340066Z",
     "start_time": "2019-03-07T23:15:09.334898Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 28000 samples, validate on 7887 samples\n",
      "Epoch 1/50\n",
      " 2816/28000 [==>...........................] - ETA: 51:31 - loss: 2.0925 - acc: 0.2219"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-90-dd78df776625>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      9\u001b[0m history = model.fit(X_train, y_train, batch_size=batch_size,\n\u001b[1;32m     10\u001b[0m     \u001b[0mepochs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m     validation_data=(X_test, y_test))\n\u001b[0m",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m   1035\u001b[0m                                         \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1036\u001b[0m                                         \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1037\u001b[0;31m                                         validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m   1038\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1039\u001b[0m     def evaluate(self, x=None, y=None,\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/engine/training_arrays.py\u001b[0m in \u001b[0;36mfit_loop\u001b[0;34m(model, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m    197\u001b[0m                     \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    198\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 199\u001b[0;31m                 \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    200\u001b[0m                 \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mto_list\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    201\u001b[0m                 \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout_labels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mouts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2664\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_legacy_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2665\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2666\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2667\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2668\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mpy_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mis_tensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2634\u001b[0m                                 \u001b[0msymbol_vals\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2635\u001b[0m                                 session)\n\u001b[0;32m-> 2636\u001b[0;31m         \u001b[0mfetched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_callable_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marray_vals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2637\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mfetched\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2638\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1380\u001b[0m           ret = tf_session.TF_SessionRunCallable(\n\u001b[1;32m   1381\u001b[0m               \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_handle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1382\u001b[0;31m               run_metadata_ptr)\n\u001b[0m\u001b[1;32m   1383\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1384\u001b[0m           \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "#Creating 2nd model and training(fitting)\n",
    "\n",
    "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
    " \n",
    "batch_size = 128\n",
    "epochs = 50\n",
    "\n",
    "# Fit the model on the batches generated by datagen.flow().\n",
    "history = model.fit(X_train, y_train, batch_size=batch_size,\n",
    "    epochs = epochs, \n",
    "    validation_data=(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Consider them as 3 different images"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:29:36.898687Z",
     "start_time": "2019-03-07T23:29:36.348388Z"
    }
   },
   "outputs": [],
   "source": [
    "input_img = Input(shape=(shape_x, shape_y, 1))\n",
    "input_hog_img = Input(shape=(shape_x, shape_y, 1))\n",
    "input_hog_slid_img = Input(shape=(shape_x, shape_y, 1))\n",
    "    \n",
    "### Input image\n",
    "layer_1 = Conv2D(64, (3,3), padding='same', activation='relu')(input_img)\n",
    "layer_1 = BatchNormalization()(layer_1)\n",
    "layer_1 = Activation('relu')(layer_1)\n",
    "layer_1 = MaxPooling2D((2,2), strides=None, padding='same')(layer_1)\n",
    "layer_1 = Dropout(0.2)(layer_1)\n",
    "\n",
    "# HOG image\n",
    "layer_2 = Conv2D(64, (3,3), padding='same', activation='relu')(input_hog_img)\n",
    "layer_2 = BatchNormalization()(layer_2)\n",
    "layer_2 = Activation('relu')(layer_2)\n",
    "layer_2 = MaxPooling2D((2,2), strides=None, padding='same')(layer_2)\n",
    "layer_2 = Dropout(0.2)(layer_2)\n",
    "\n",
    "# HOG Sliding image\n",
    "layer_3 = Conv2D(64, (3,3), padding='same', activation='relu')(input_hog_slid_img)\n",
    "layer_3 = BatchNormalization()(layer_3)\n",
    "layer_3 = Activation('relu')(layer_3)\n",
    "layer_3 = MaxPooling2D((2,2), strides=None, padding='same')(layer_3)\n",
    "layer_3 = Dropout(0.2)(layer_3)\n",
    "\n",
    "layer_4 = keras.layers.concatenate([layer_1, layer_2, layer_3], axis=3)\n",
    "\n",
    "Flat = Flatten()(layer_4)\n",
    "\n",
    "Dense1 = Dense(100, activation='relu')(Flat)\n",
    "Dense2 = Dense(30, activation='relu')(Dense1)\n",
    "Dense3 = Dense(7, activation='softmax')(Dense2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:29:48.088697Z",
     "start_time": "2019-03-07T23:29:48.081540Z"
    }
   },
   "outputs": [],
   "source": [
    "model = Model([input_img, input_hog_img, input_hog_slid_img], Dense3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:30:05.310584Z",
     "start_time": "2019-03-07T23:30:05.039220Z"
    }
   },
   "outputs": [],
   "source": [
    "plot_model(model, to_file='model_images/model_plot_39.png', show_shapes=True, show_layer_names=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src='model_images/model_plot_39.png'>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-07T23:30:52.450547Z",
     "start_time": "2019-03-07T23:30:52.402421Z"
    }
   },
   "outputs": [],
   "source": [
    "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
    " \n",
    "batch_size = 256\n",
    "epochs = 50\n",
    "\n",
    "# Fit the model on the batches generated by datagen.flow()."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T06:57:19.932357Z",
     "start_time": "2019-03-07T23:34:33.043350Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 28000 samples, validate on 7887 samples\n",
      "Epoch 1/50\n",
      "28000/28000 [==============================] - 1083s 39ms/step - loss: 1.9251 - acc: 0.3046 - val_loss: 1.7567 - val_acc: 0.3251\n",
      "Epoch 2/50\n",
      "28000/28000 [==============================] - 1085s 39ms/step - loss: 1.5070 - acc: 0.4280 - val_loss: 1.5912 - val_acc: 0.3996\n",
      "Epoch 3/50\n",
      "28000/28000 [==============================] - 945s 34ms/step - loss: 1.3875 - acc: 0.4797 - val_loss: 1.4549 - val_acc: 0.4520\n",
      "Epoch 4/50\n",
      "28000/28000 [==============================] - 858s 31ms/step - loss: 1.2848 - acc: 0.5191 - val_loss: 1.4513 - val_acc: 0.4561\n",
      "Epoch 5/50\n",
      "28000/28000 [==============================] - 857s 31ms/step - loss: 1.2047 - acc: 0.5497 - val_loss: 1.4936 - val_acc: 0.4529\n",
      "Epoch 6/50\n",
      "28000/28000 [==============================] - 850s 30ms/step - loss: 1.1424 - acc: 0.5745 - val_loss: 1.4704 - val_acc: 0.4596\n",
      "Epoch 7/50\n",
      "28000/28000 [==============================] - 850s 30ms/step - loss: 1.0542 - acc: 0.6079 - val_loss: 1.4740 - val_acc: 0.4619\n",
      "Epoch 8/50\n",
      "28000/28000 [==============================] - 861s 31ms/step - loss: 0.9763 - acc: 0.6363 - val_loss: 1.5628 - val_acc: 0.4639\n",
      "Epoch 9/50\n",
      "28000/28000 [==============================] - 856s 31ms/step - loss: 0.9073 - acc: 0.6650 - val_loss: 1.5790 - val_acc: 0.4551\n",
      "Epoch 10/50\n",
      "28000/28000 [==============================] - 861s 31ms/step - loss: 0.8511 - acc: 0.6852 - val_loss: 1.7631 - val_acc: 0.4310\n",
      "Epoch 11/50\n",
      "28000/28000 [==============================] - 855s 31ms/step - loss: 0.7925 - acc: 0.7109 - val_loss: 1.6948 - val_acc: 0.4674\n",
      "Epoch 12/50\n",
      "28000/28000 [==============================] - 848s 30ms/step - loss: 0.7448 - acc: 0.7281 - val_loss: 1.7687 - val_acc: 0.4600\n",
      "Epoch 13/50\n",
      "28000/28000 [==============================] - 851s 30ms/step - loss: 0.6832 - acc: 0.7526 - val_loss: 1.8618 - val_acc: 0.4592\n",
      "Epoch 14/50\n",
      "28000/28000 [==============================] - 852s 30ms/step - loss: 0.6429 - acc: 0.7660 - val_loss: 1.9125 - val_acc: 0.4630\n",
      "Epoch 15/50\n",
      "28000/28000 [==============================] - 858s 31ms/step - loss: 0.5883 - acc: 0.7898 - val_loss: 1.9513 - val_acc: 0.4544\n",
      "Epoch 16/50\n",
      "28000/28000 [==============================] - 856s 31ms/step - loss: 0.5597 - acc: 0.7970 - val_loss: 1.9667 - val_acc: 0.4851\n",
      "Epoch 17/50\n",
      "28000/28000 [==============================] - 848s 30ms/step - loss: 0.5041 - acc: 0.8179 - val_loss: 2.1044 - val_acc: 0.4547\n",
      "Epoch 18/50\n",
      "28000/28000 [==============================] - 852s 30ms/step - loss: 0.4707 - acc: 0.8319 - val_loss: 2.1921 - val_acc: 0.4772\n",
      "Epoch 19/50\n",
      "28000/28000 [==============================] - 859s 31ms/step - loss: 0.4482 - acc: 0.8408 - val_loss: 2.4423 - val_acc: 0.4208\n",
      "Epoch 20/50\n",
      "28000/28000 [==============================] - 859s 31ms/step - loss: 0.4264 - acc: 0.8469 - val_loss: 2.3743 - val_acc: 0.4624\n",
      "Epoch 21/50\n",
      "28000/28000 [==============================] - 857s 31ms/step - loss: 0.3986 - acc: 0.8566 - val_loss: 2.6059 - val_acc: 0.4405\n",
      "Epoch 22/50\n",
      "28000/28000 [==============================] - 860s 31ms/step - loss: 0.3784 - acc: 0.8664 - val_loss: 2.7263 - val_acc: 0.4312\n",
      "Epoch 23/50\n",
      "28000/28000 [==============================] - 863s 31ms/step - loss: 0.3443 - acc: 0.8779 - val_loss: 2.9110 - val_acc: 0.4258\n",
      "Epoch 24/50\n",
      "28000/28000 [==============================] - 855s 31ms/step - loss: 0.3165 - acc: 0.8909 - val_loss: 2.8301 - val_acc: 0.4384\n",
      "Epoch 25/50\n",
      "28000/28000 [==============================] - 859s 31ms/step - loss: 0.3072 - acc: 0.8937 - val_loss: 2.7174 - val_acc: 0.4762\n",
      "Epoch 26/50\n",
      "28000/28000 [==============================] - 864s 31ms/step - loss: 0.2874 - acc: 0.9017 - val_loss: 2.8231 - val_acc: 0.4712\n",
      "Epoch 27/50\n",
      "28000/28000 [==============================] - 864s 31ms/step - loss: 0.2792 - acc: 0.9022 - val_loss: 2.9024 - val_acc: 0.4660\n",
      "Epoch 28/50\n",
      "28000/28000 [==============================] - 867s 31ms/step - loss: 0.2804 - acc: 0.9030 - val_loss: 2.9079 - val_acc: 0.4747\n",
      "Epoch 29/50\n",
      "28000/28000 [==============================] - 862s 31ms/step - loss: 0.2680 - acc: 0.9082 - val_loss: 3.4439 - val_acc: 0.4277\n",
      "Epoch 30/50\n",
      "28000/28000 [==============================] - 864s 31ms/step - loss: 0.2536 - acc: 0.9111 - val_loss: 3.0514 - val_acc: 0.4580\n",
      "Epoch 31/50\n",
      "10240/28000 [=========>....................] - ETA: 8:25 - loss: 0.2334 - acc: 0.9195"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-130-f5c01b5de2ba>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m history = model.fit([X_i_train, X_hog_img_train, X_hog_slid_img_train], y_train, batch_size=batch_size,\n\u001b[1;32m      3\u001b[0m     \u001b[0mepochs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m     validation_data=([X_i_test, X_hog_img_test, X_hog_slid_img_test], y_test))\n\u001b[0m",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m   1035\u001b[0m                                         \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1036\u001b[0m                                         \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1037\u001b[0;31m                                         validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m   1038\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1039\u001b[0m     def evaluate(self, x=None, y=None,\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/engine/training_arrays.py\u001b[0m in \u001b[0;36mfit_loop\u001b[0;34m(model, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m    197\u001b[0m                     \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    198\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 199\u001b[0;31m                 \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    200\u001b[0m                 \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mto_list\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    201\u001b[0m                 \u001b[0;32mfor\u001b[0m \u001b[0ml\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout_labels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mouts\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2664\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_legacy_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2665\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2666\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2667\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2668\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mpy_any\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mis_tensor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[0;32min\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m   2634\u001b[0m                                 \u001b[0msymbol_vals\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2635\u001b[0m                                 session)\n\u001b[0;32m-> 2636\u001b[0;31m         \u001b[0mfetched\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_callable_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marray_vals\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2637\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mfetched\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2638\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1380\u001b[0m           ret = tf_session.TF_SessionRunCallable(\n\u001b[1;32m   1381\u001b[0m               \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_handle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1382\u001b[0;31m               run_metadata_ptr)\n\u001b[0m\u001b[1;32m   1383\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1384\u001b[0m           \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "# Fit the model on the batches generated by datagen.flow().\n",
    "history = model.fit([X_i_train, X_hog_img_train, X_hog_slid_img_train], y_train, batch_size=batch_size,\n",
    "    epochs = epochs, \n",
    "    validation_data=([X_i_test, X_hog_img_test, X_hog_slid_img_test], y_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Plotting accuracy and loss curves for 2nd model\n",
    "\n",
    "# Loss Curves\n",
    "plt.figure(figsize=[8,6])\n",
    "plt.plot(history.history['loss'],'r',linewidth=2.0)\n",
    "plt.plot(history.history['val_loss'],'b',linewidth=2.0)\n",
    "plt.legend(['Training loss', 'Validation Loss'],fontsize=18)\n",
    "plt.xlabel('Epochs ',fontsize=16)\n",
    "plt.ylabel('Loss',fontsize=16)\n",
    "plt.title('Loss Curves',fontsize=16)\n",
    " \n",
    "# Accuracy Curves\n",
    "plt.figure(figsize=[8,6])\n",
    "plt.plot(history.history['acc'],'r',linewidth=2.0)\n",
    "plt.plot(history.history['val_acc'],'b',linewidth=2.0)\n",
    "plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)\n",
    "plt.xlabel('Epochs ',fontsize=16)\n",
    "plt.ylabel('Accuracy',fontsize=16)\n",
    "plt.title('Accuracy Curves',fontsize=16)0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# VI. Separate input architecture"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:50:28.734503Z",
     "start_time": "2019-03-08T07:50:28.192356Z"
    }
   },
   "outputs": [],
   "source": [
    "input_img = Input(shape=(shape_x, shape_y, 1))\n",
    "input_hog_img = Input(shape=(shape_x, shape_y, 1))\n",
    "#input_hog_slid_img = Input(shape=(shape_x, shape_y, 1))\n",
    "\n",
    "input_hog = Input(shape=(72,1))\n",
    "input_land = Input(shape=(136,1))\n",
    "input_hog_slid = Input(shape=(2592,1))\n",
    "\n",
    "### Input image\n",
    "layer_1 = Conv2D(64, (3,3), padding='same', activation='relu')(input_img)\n",
    "layer_1 = BatchNormalization()(layer_1)\n",
    "layer_1 = Activation('relu')(layer_1)\n",
    "layer_1 = MaxPooling2D((2,2), strides=None, padding='same')(layer_1)\n",
    "layer_1 = Dropout(0.2)(layer_1)\n",
    "\n",
    "# HOG image\n",
    "layer_2 = Conv2D(64, (3,3), padding='same', activation='relu')(input_hog_img)\n",
    "layer_2 = BatchNormalization()(layer_2)\n",
    "layer_2 = Activation('relu')(layer_2)\n",
    "layer_2 = MaxPooling2D((2,2), strides=None, padding='same')(layer_2)\n",
    "layer_2 = Dropout(0.2)(layer_2)\n",
    "\n",
    "# HOG Sliding image\n",
    "#layer_3 = Conv2D(64, (3,3), padding='same', activation='relu')(input_hog_slid_img)\n",
    "#layer_3 = BatchNormalization()(layer_3)\n",
    "#layer_3 = Activation('relu')(layer_3)\n",
    "#layer_3 = MaxPooling2D((2,2), strides=None, padding='same')(layer_3)\n",
    "#layer_3 = Dropout(0.2)(layer_3)\n",
    "\n",
    "layer_4 = keras.layers.concatenate([layer_1, layer_2], axis=1)\n",
    "Flat = Flatten()(layer_4)\n",
    "Dense1 = Dense(100, activation='relu')(Flat)\n",
    "\n",
    "layer_5 = Dense(100)(input_hog)\n",
    "layer_6 = Dense(100)(input_land)\n",
    "layer_7 = keras.layers.concatenate([layer_5, layer_6], axis=1)\n",
    "\n",
    "layer_8 = Dense(100,activation='relu')(input_hog_slid)\n",
    "\n",
    "layer_7 = keras.layers.concatenate([layer_7, layer_8], axis=1)\n",
    "Flat_2 = Flatten()(layer_7)\n",
    "Dense2 = Dense(100)(Flat_2)\n",
    "layer_8 = keras.layers.concatenate([Dense1, Dense2], axis=1)\n",
    "\n",
    "Dense3 = Dense(100, activation='relu')(layer_8)\n",
    "Dense3 = Dense(30, activation='relu')(Dense3)\n",
    "Dense3 = Dense(7, activation='softmax')(Dense3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:50:36.796044Z",
     "start_time": "2019-03-08T07:50:36.788948Z"
    }
   },
   "outputs": [],
   "source": [
    "model = Model([input_img, input_hog_img, input_hog, input_land, input_hog_slid], Dense3)\n",
    "#model = Model([input_img, input_hog_img, input_hog_slid_img], output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:51:08.122300Z",
     "start_time": "2019-03-08T07:51:07.922152Z"
    }
   },
   "outputs": [],
   "source": [
    "plot_model(model, to_file='model_images/model_plot_40.png', show_shapes=True, show_layer_names=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-05T20:26:51.054136Z",
     "start_time": "2019-03-05T20:26:51.044285Z"
    }
   },
   "source": [
    "<img src='model_images/model_plot_40.png'>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-03-08T07:51:43.440296Z",
     "start_time": "2019-03-08T07:51:43.353226Z"
    }
   },
   "outputs": [],
   "source": [
    "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
    " \n",
    "batch_size = 128\n",
    "epochs = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "start_time": "2019-03-08T07:58:49.644Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 28000 samples, validate on 7887 samples\n",
      "Epoch 1/10\n"
     ]
    }
   ],
   "source": [
    "history = model.fit([X_i_train, X_hog_img_train, X_hog_feat_train, X_land_train, X_hog_slid_feat_train], y_train, batch_size=batch_size,\n",
    "    epochs = epochs, \n",
    "    validation_data=([X_i_test, X_hog_img_test, X_hog_feat_test, X_land_test, X_hog_slid_feat_test], y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# V. Evaluate the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 334,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-02-20T06:54:44.637469Z",
     "start_time": "2019-02-20T06:54:43.957235Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Accuracy Curves')"
      ]
     },
     "execution_count": 334,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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z88vUqs/fPgw69ato02bNkVe06BBA66++mquvvpqrLXcdttt/POf/+S///0vQ4YMAdx0xLPPPpuzPfc3WbJkCaeeeip/+ctfmD59eqXLGylUo/dHQS8iEcRbiy5eY166dCkffvhhOIpUphYtWtC5c2f+85//FPTbgwtj35H5lTFs2DC2bNnCK6+8UmT/s88+y759+7j44osBdyvkrKysIucYY+jWrRvgRu8D7NpV8gapHTt2JD4+vuCcaKcavT8KehGJIF26dKFdu3Y88sgj7N27l7Zt27J69WpefPFFunTpwtKlS8NdxBImTJjA+eefT+/evRkzZgzJyclMmzatYCBgZW/Feu+99/LOO+9www038M0339ClSxcWL17MlClT6Ny5M7fddhvgxgu0atWKYcOG0bVrV9LS0vjpp594/vnnadCgARdccAEAV111FXv27OGcc86hefPmHDx4kNdff51Dhw5x9dVXB+eXEWYKen98gj4/Hz74AAYMgJSU8BZLRI5PNWvW5KOPPuLOO+/kpZdeIicnh5NPPplp06Yxb968iAz6QYMG8dFHH3Hvvffy6KOPkpqayhVXXMGwYcM444wzSExMrNR169Wrx4IFC3jggQeYOXMmkydPJj09nVtuuYWHHnqoYIxDSkoKY8eO5fPPP+fjjz8mOzubxo0bc8kll3D33XcXLDt83XXX8corrzBlyhR27dpFSkoKnTt3ZubMmQwdOjRov49wMpE2eKIyevbsaRcvXhy8Cz7+ONx5J4wfz4sd/8Ho0XDvvfDII8F7C5Hj2erVq+nQoUO4iyFh8NprrzFy5EhmzJjBsGHDwl2ciBXIvxFjzBJrbc/yrqU+en98avQffeSebtkSvuKIiESb/Px8Dh8+XGRfbm4uTz75JPHx8ZxxxhlhKtnxR033/niCPj9zL1/Oc7tycsJYHhGRKJOVlUWHDh248soradeuHTt37mTatGmsXLmSBx54wO+iQFI1FPT+eIJ+xZb6BePx/NyvQURESpGYmMi5557LO++8U3Bznfbt2zNp0iRuvPHGMJfu+KKg98cT9LO3FfaPqEYvIhK4+Ph4Xn755XAXQ1AfvX+eoJ+zt1vBLgW9iIhEIwW9P6mpHCWWuYdOK9ilpnsREYlGCnp/kpNZEnMa+6lDfLybfqgavYiIRCMFvT/GMCfhPADOPN1ND1GNXkRE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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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XEJdeWX4YjhgQNk+KydH9d//jr7AHnVUuA16/XoLNoJ9HTta+/1991mHuZdeUv3HPyxlXr26avv2dnGPDEzGj1fde+/wZ/znPyWv5+LFqh9+qPrkkyVrH8/OLvm5ImzerLpyZZk+osRWrLDzVnTpGgDsD4yMeD8QGJivzP3ApTGOPRsYGvF+KHB2UefzAMA5lzCvvWZ/MmvWDPd8f/31guU++8yGrn3yieratbE/KytL9Zxz7DOqV7dAoHFje7/TTtbW3qmTva9b1y72RcnOLvyufNs2ywg8+GDsNvg0deSRlvgorwTC1Kmq9eur9u1bPudLpngDgPJuaGkFLIx4vwjona9MJwAR+RHLGNymqp8Xcmyr/CcQkcuBywHaBlMyOudcpNxcm+51zhxYtAgOOshmZCvMtGlw+eX2esgQm2nuyivhsstsmtju3W1O+muvtfnpAxkZNgNd797WFr7DDjb97Guv2Qxz9etb2/tRR9kqcuedB6NGWVs9QLduNuNcly5Ff58aNQrfV726zX1fgcydC198Ya9HjAj/OJJl61brerBxI3z3HWzYED35X2WVjj0tqmPNAH2B1sD3IlLIJM8FqeozwDNgnQCTUUHnXAWxaRO8+aat5LZ0KSxZAosXw++/w5Yt4XK1atkCLQMHFvzLv349nHoqbN4MF1xgF32AsWPhlVfglFNsutm//90Cilq1rNyMGTBuXLjjXn7Nm1vHvR497H2rVjY97D33wH332RXp4YehTp3k/GzS2FtvhV+PHJn8AOD//s/6VYK1lUycCH37Jvec6aC8A4DFQJuI961D2yItAn5W1W3AHyLyGxYQLMaCgshjRyWtps65im39eruzHjs29v6mTaFDB7vgf/GFXXhfeAHuvhv22y+8BOz779tKb927W893ETv+qadgyhR7HHaYbevWzQKObt3s/ebNFgRMnWpzzK9ZY3PJ16pl88G3bx9dp2rV7Go0aFDeedavt01nnGHr01R2qjZoIPD11zYAoagkR1l8+y089JD96PfbD378EX7+uWoEAOXdB6A61nmvPeFOgLvnK9MPeDn0ugmW9m+Mdf77A+sA2Cj0eseizud9AJyrojZsUD3wQM3rFX/77dZBbsQIGxu/Zk10+bFjVffbL7pDXuSjQQPV334reJ65c1V32CHcKXDLloR/lWDofps2Sfn4cpGbq/rm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ZciQIR7T586dY/r06dxwww155uVHVUlLS6NKFf9G+FSuXPmiT96FTR4uhYyMDObOncugQYNQVebNm8ekSZMIDQ0t6dAKdPr0acLt4swndgvAD3nu/9vQKmPKrJUrVyIizJ8/nzfeeIOYmBiCg4P5xz/+AcCmTZu49957iY6OJiwsjGrVqhEbG8vy5cvzrMtbH4Dcsm+++YYnn3yS+vXrExISQtu2bVm9erXH8t76ALiXbdiwgc6dOxMWFkZkZCQPPvggaWl5H0S2Zs0afvOb3xASEkK9evUYM2aMqyl/woQJPu+bJUuW8Msvv3DfffcxdOhQTp06xeLFi/Otv2DBAmJjY6levTphYWHExMQwevRojzHrOTk5TJkyhfbt21O1alXCw8O55pprGD9+/AX3Y666dety8803e90/K1eupGPHjlSpUoU777wTgMOHD/PEE09wzTXXUKNGDUJDQ2nZsiWTJk0iJycnz/ozMjJ4+eWXad26NaGhodSoUYPrr7+eadOmAfDKK68gInz66ad5lv3111+pVq0avXv39mHvlh7WAuAHGwFgTPnz6quvcurUKYYPH06dOnVo2rQpAO+++y7JycncfffdNGrUiGPHjjFz5kxuueUWFi9eTL9+/Xxa/8CBAwkNDeWPf/wj6enp/O1vf+PWW2/l4MGD1K9fv8Dlv/zyS959913uv/9+hgwZwscff8y0adMICgri73//u6vexx9/TK9evahTpw5PP/004eHhLFiwgPXr1/u9TxISEoiJieH6668H4KqrriIxMdFrS8qYMWOYNGkSrVq1YsyYMURFRXHw4EEWLVrEhAkTCAgIQFW56667WLRoEZ06deLZZ5+levXq7N27l0WLFvHss8/6HWOuzz77jHnz5hEfH8+wYcMICAgAYNu2bfzrX//itttu44orriAzM5MVK1YwZswYvvvuO9544w3XOjIyMujevTubNm2iV69eDB06lMDAQHbt2sV7773HyJEjGTZsGM8//zyJiYl5bim9++67nD59mvvvv7/Q36NEqGq5/Vx33XValH7zG1VQXUdX1RYtinTdxlwqe/fu9T4DSueniCQlJSmgSUlJXud/+OGHCmhkZKSeOHEiz/wzZ87kKTt9+rQ2adJE27Rp41H+1FNPKaBHjhzJU9avXz/NyclxlW/YsEEBHTdunKssPT1dAR05cmSe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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Plotting accuracy and loss curves for 2nd model\n",
    "\n",
    "# Loss Curves\n",
    "plt.figure(figsize=[8,6])\n",
    "plt.plot(history.history['loss'],'r',linewidth=2.0)\n",
    "plt.plot(history.history['val_loss'],'b',linewidth=2.0)\n",
    "plt.legend(['Training loss', 'Validation Loss'],fontsize=18)\n",
    "plt.xlabel('Epochs ',fontsize=16)\n",
    "plt.ylabel('Loss',fontsize=16)\n",
    "plt.title('Loss Curves',fontsize=16)\n",
    " \n",
    "# Accuracy Curves\n",
    "plt.figure(figsize=[8,6])\n",
    "plt.plot(history.history['acc'],'r',linewidth=2.0)\n",
    "plt.plot(history.history['val_acc'],'b',linewidth=2.0)\n",
    "plt.legend(['Training Accuracy', 'Validation Accuracy'],fontsize=18)\n",
    "plt.xlabel('Epochs ',fontsize=16)\n",
    "plt.ylabel('Accuracy',fontsize=16)\n",
    "plt.title('Accuracy Curves',fontsize=16)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# VI. Save the model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 332,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-02-20T06:54:08.363906Z",
     "start_time": "2019-02-20T06:54:01.210003Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "17443"
      ]
     },
     "execution_count": 332,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#save the model weights\n",
    "json_string = model.to_json()\n",
    "model.save_weights(local_path + 'savedmodels/model_inception.h5')\n",
    "open(local_path + 'savedmodels/model_inception.json', 'w').write(json_string)\n",
    "#model.save_weights(local_path + 'savedmodels/Emotion_Face_Detection_Model.h5')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# VII. Sources"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Visualization : https://github.com/JostineHo/mememoji/blob/master/data_visualization.ipynb\n",
    "- State of the art Architecture : https://github.com/amineHorseman/facial-expression-recognition-using-cnn\n",
    "- Eyes Tracking : https://www.pyimagesearch.com/2017/04/24/eye-blink-detection-opencv-python-dlib/\n",
    "- Face Alignment : https://www.pyimagesearch.com/2017/05/22/face-alignment-with-opencv-and-python/\n",
    "- C.Pramerdorfer,  and  M.Kampel.Facial  Expression  Recognition  using  Con-volutional  Neural  Networks:  State  of  the  Art.  Computer  Vision  Lab,  TU  Wien. https://arxiv.org/pdf/1612.02903.pdf\n",
    "- A Brief Review of Facial Emotion Recognition Based\n",
    "on Visual Information : https://www.mdpi.com/1424-8220/18/2/401/pdf\n",
    "- Going deeper in facial expression recognition using deep neural networks : https://ieeexplore.ieee.org/document/7477450"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
